#include "Stack.h"

#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include<string.h>

// 初始化栈 
 void StackInit(Stack* ps)
{
  assert(ps);
  ps->a=(STDataType*)malloc(sizeof(STDataType)*5); 
  if(NULL==ps->a)
  {
    assert(0);
    return;
  }
    ps->capacity=5;
    ps->size=0;
}

// 检查栈是否满
 void CheckStack(Stack* ps)
{
  assert(ps);

  if(ps->capacity==ps->size)
  {
    //1.申请空间
    int newcapacity=ps->capacity*2;
    STDataType *temp=(STDataType*)malloc(sizeof(STDataType)*newcapacity);
    if(temp==NULL)
    {
      assert(0);
      return;
    }
    //2.拷贝元素
    memcpy(temp,ps->a,sizeof(STDataType)*ps->size);
    //3.释放旧空间
    free(ps->a);
    //4.使用新空间 
    ps->a=temp;
    ps->capacity=newcapacity;
  }
}
 // 入栈 
 void StackPush(Stack* ps, STDataType data)
{
  assert(ps);
  
  CheckStack(ps);
  ps->a[ps->size]=data;
  ps->size++;
}
 // 出栈 
 void StackPop(Stack* ps)
{
  assert(ps);
  if(!StackEmpty(ps))
  {
    ps->size--;
  }
  return;
}
 // 获取栈顶元素 
 STDataType StackTop(Stack* ps)
{
  assert(ps);
  return ps->a[ps->size-1];
}
 // 获取栈中有效元素个数 
 int StackSize(Stack* ps)
{
  assert(ps);
  return ps->size;
}
 // 检测栈是否为空，如果为空返回非零结果，如果不为空返回0 
 int StackEmpty(Stack* ps)
{
  assert(ps);
  return 0==ps->size;
}
 // 销毁栈 
 void StackDestroy(Stack* ps)
{
  assert(ps);
  if(ps->a)
  {
  free(ps->a);
  ps->a=NULL;
  ps->capacity=0;
  ps->size=0;
  }
}
////////////////////////////////
void TestStack()
{
  Stack s;
  StackInit(&s);

  StackPush(&s,1);
  StackPush(&s,2);
  StackPush(&s,3);
  StackPush(&s,4);
  StackPush(&s,5);
  StackPush(&s,6);
  StackPush(&s,7);
  printf("%d\n",StackTop(&s));
  printf("%d\n",StackSize(&s));

  StackPop(&s);
  StackPop(&s);
  StackPop(&s);
  printf("%d\n",StackTop(&s));
  printf("%d\n",StackSize(&s));

  StackDestroy(&s);
}
